home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 1992 August / info-mac-1992.iso / Applications (app) / Image 1.44 / Macros / Corpus Collosum Macros next >
Text File  |  1991-10-28  |  4KB  |  203 lines

  1. {
  2. This is a set of macros for measuring the area of various regions in the corpus collosum in MRI scans. It assumes that the scans are 256x256, that you are using a 19" monitor, that the Undo buffer is set to 600K, and that you have a lot of RAM.
  3.  
  4. This is the procedure:
  5.  
  6. 1) Open or activate the scan to be analyzed and type Z.
  7. 2) Draw a base line using the line tool.
  8. 3) Draw perpendicular lines by typing S or R.
  9. 4) Draw a perpendicular line at an arbitrary location by clicking
  10.    on the base line with the line tool and typing A.
  11. 5) Outline the corpus collosum.
  12. 6) Threshold by typing B.
  13. 7) Measure the areas by clicking inside each region with the wand.
  14. 8) Revert to grayscale by typing G. (Optional)
  15. 9) Dispose of the 768x768 working window by typing D.
  16. }
  17.  
  18. var  {Global variables}
  19.   WindowNum:integer;
  20.   x1,y1,x2,y2,LineWidth:integer;
  21.   size,angle,dx,dy,pi,theta:real;
  22.   width,height,dx,dy,i:integer;
  23.  
  24.  
  25. macro 'Zoom Window [Z]';
  26. var
  27.   top,left,width,height:integer;
  28. begin
  29.   GetPicSize(width,height);
  30.   if width>600 then begin
  31.     PutMessage('Window has already been zoomed.');
  32.     exit;
  33.   end;
  34.   KillRoi;
  35.   SetScale(1,'mm'); {Assume 1 pixel/mm}
  36.   WindowNum:=PicNumber;
  37.   SetScaling('Nearest; New Window');
  38.   ScaleAndRotate(3,3,0);
  39.   ChangeValues(254,255,253); {Reserve 254-255(black) for graphics}
  40.   SetForegroundColor(254);
  41.   ApplyLUT;
  42.   SetLineWidth(1);
  43. end;
  44.  
  45.  
  46. procedure DrawPerpendicularLine(x,y:integer);
  47. begin
  48.   moveto(x,height-y);
  49.   lineto(x+size*cos(theta+angle),height-(y+size*sin(theta+angle)));
  50.   moveto(x,height-y);
  51.   lineto(x+size*cos(theta-angle),height-(y+size*sin(theta-angle)));
  52. end;
  53.  
  54.  
  55. procedure DrawLines(nSegments:integer);
  56. begin
  57.   for i:=1 to nSegments-1 do
  58.     DrawPerpendicularLine(x1+round(i*dx/nSegments),y1+round(i*dy/nSegments));
  59. end;
  60.  
  61.  
  62. procedure DrawLeftLine;
  63. var
  64.   nSegments,i:integer;
  65. begin
  66.   nSegments:=5;
  67.   i:=1;
  68.   DrawPerpendicularLine(x1+round(i*dx/nSegments),y1+round(i*dy/nSegments));
  69. end;
  70.  
  71.  
  72. procedure DrawRightLine;
  73. var
  74.   nSegments,i:integer;
  75. begin
  76.   nSegments:=5;
  77.   i:=4;
  78.   DrawPerpendicularLine(x1+round(i*dx/nSegments),y1+round(i*dy/nSegments));
  79. end;
  80.  
  81.  
  82. procedure DrawThePerpendiculars;
  83. begin
  84.   GetLine(x1,y1,x2,y2,LineWidth);
  85.   if (x1<0) or ((x2-x1)<10) then begin
  86.     PutMessage('Select the base line first using the line tool.');
  87.     exit;
  88.   end;
  89.   Fill;
  90.   KillRoi;
  91.   size:=sqrt(sqr(x2-x1)+sqr(y2-y1))/2;
  92.   angle:=90; {degrees}
  93.   pi:=3.14159;
  94.   GetPicSize(width,height);
  95.   y1:=height-y1;
  96.   y2:=height-y2;
  97.   angle:=(angle/180)*pi;
  98.   dx:=x1-x2;
  99.   dy:=y1-y2;
  100.   if dx=0 then begin
  101.     if dy>=0 then theta:=pi/2 else theta:=3/2*pi
  102.   end else begin
  103.     theta:=arctan(dy/dx);
  104.     if dx<0 then theta:=theta+pi;
  105.   end;
  106.   dx:=x2-x1;
  107.   dy:=y2-y1;
  108.   SetForegroundColor(255);
  109.   DrawLines(2);
  110.   DrawLines(3);
  111. end;
  112.  
  113.  
  114. Macro 'Draw Perpendicular Lines-Left[S]';
  115. begin
  116.   DrawThePerpendiculars;
  117.   DrawLeftLine;
  118. end;
  119.  
  120.  
  121. Macro 'Draw Perpendicular Lines-Right[R]';
  122. begin
  123.   DrawThePerpendiculars;
  124.   DrawRightLine;
  125. end;
  126.  
  127.  
  128. macro 'Draw Arbitrary Perpendicular Line [A]';
  129. var
  130.   xx1,yy1,xx2,yy2:integer;
  131.   fraction:real;
  132. begin
  133.   if angle=0 then begin
  134.     PutMessage('Draw the other perpendiclular lines first.');
  135.     exit;
  136.   end;
  137.   if dx=0 then begin
  138.     PutMessage('Draw base line first.');
  139.     exit;
  140.   end;
  141.   GetLine(xx1,yy1,xx2,yy2,LineWidth);
  142.   if not ((xx1>x1) and (xx1<x2)) then begin
  143.     PutMessage('Click with the line tool first.');
  144.     exit;
  145.   end;
  146.   KillRoi;
  147.   fraction:=(xx1-x1)/dx;
  148.   DrawPerpendicularLine(x1+round(dx*fraction),y1+round(dy*fraction));
  149. end;
  150.  
  151.  
  152. macro 'Make Binary [B]';
  153. var
  154.   top,left,width,height:integer;
  155. begin
  156.   GetRoi(top,left,width,height);
  157.   if width=0 then begin
  158.     PutMessage('Please outline first.');
  159.     exit;
  160.   end;
  161.   DrawBoundary;
  162.   KillRoi;
  163.   SetThreshold(255);
  164.   MeasureArea(true);
  165.   MeasureDensity(false);
  166.   LabelParticles(false);
  167.   IncludeInteriorHoles(true);
  168.   WandAutoMeasure(true);
  169.   ResetCounter;
  170.   ShowResults;
  171. end;
  172.  
  173. macro 'Make Grayscale [G]';
  174. begin
  175.   ResetGrayMap;
  176.   KillRoi;
  177. end;
  178.  
  179. macro 'Dispose of Window [D]';
  180. var
  181.   width,height:integer;
  182. begin
  183.   GetPicSize(width,height);
  184.   if width>600
  185.     then dispose
  186.     else exit;
  187.   if windowNum<>0 then SelectPic(WindowNum);
  188. end;
  189.  
  190. macro 'Adjust Areas [Q]';
  191. var
  192.   i:integer;
  193. begin
  194.   for i:=1 to rCount do
  195.     rArea[i]:=rArea[i]/9;
  196.   ShowResults;
  197. end;
  198.  
  199.  
  200.  
  201.  
  202.  
  203.